home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / basic / smalle.com / SMALLEXE.BAS < prev    next >
Encoding:
BASIC Source File  |  1990-12-16  |  3.8 KB  |  180 lines

  1.     REM $TITLE: 'SMALLEXE'
  2.  
  3.     REM $INCLUDE: 'C:\QBASIC\QB.BI'
  4.  
  5.     DEFINT A-Z
  6.  
  7.     ' Common variables
  8.  
  9.     COMMON SHARED INPREG AS REGTYPE
  10.     COMMON SHARED OUTREG AS REGTYPE
  11.     COMMON SHARED CRLF$
  12.  
  13.     ' Subprograms
  14.  
  15.     DECLARE SUB InputLine (BUFFER$, OFFSET, LINE$)
  16.  
  17.     ' Functions
  18.  
  19.     DECLARE FUNCTION ReadData$ (DATA$)
  20.     DECLARE FUNCTION ReadTimer& ()
  21.     DECLARE FUNCTION StrToInt& (NUMSTR$)
  22.  
  23. Initialize:
  24.  
  25.     DATA$ = "1,2,3,4,5,6,7,8,9,10"
  26.     DATA$ = DATA$ + ",Now,is,the,time,for,all,good,persons,to,come"
  27.  
  28.     CHAN = 1    ' I/O channel
  29.  
  30.     CRLF$ = CHR$(13) + CHR$(10)
  31.  
  32. StartProgram:
  33.  
  34.     PRINT : PRINT "Integers"
  35.     START& = ReadTimer&
  36.     FOR I = 1 TO 10
  37.         PRINT I, StrToInt&(ReadData$(DATA$))
  38.     NEXT I
  39.     PRINT "Ticks = "; ReadTimer& - START&
  40.  
  41.     PRINT : PRINT "Strings"
  42.     START& = ReadTimer&
  43.     FOR I = 11 TO 20
  44.         PRINT I, ReadData$(DATA$)
  45.     NEXT I
  46.     PRINT "Ticks = "; ReadTimer& - START&
  47.  
  48.     PRINT : PRINT "Read ASCII file:"
  49.     OPEN "SMALLEXE.BAS" FOR BINARY AS #CHAN
  50.     FILESIZE = LOF(CHAN)
  51.     BUFFER$ = STRING$(FILESIZE, 0)
  52.     GET #CHAN, , BUFFER$
  53.     IF RIGHT$(BUFFER$, 2) <> CRLF$ THEN
  54.         BUFFER$ = BUFFER$ + CRLF$
  55.     END IF
  56.  
  57.     FILEOFFS = 1
  58.     DO UNTIL FILEOFFS > FILESIZE
  59.         CALL InputLine(BUFFER$, FILEOFFS, LINE$)
  60.         PRINT LINE$
  61.     LOOP
  62.  
  63.     CLOSE #CHAN
  64.     BUFFER$ = ""
  65.  
  66. EndProgram:
  67.  
  68.     END
  69.  
  70.     REM $PAGE
  71.  
  72.     '[]=============================================================[]
  73.     '[]      Returns one CRLF$ delimited line of text from        []
  74.     '[]              the specified buffer            []
  75.     '[]=============================================================[]
  76.  
  77.     SUB InputLine (BUFFER$, OFFSET, LINE$) STATIC
  78.  
  79.     ' Obviously you can't GET a large file all at one time; modify
  80.     '   routines to deal with a bufferfull at a time
  81.  
  82.     IF OFFSET > LEN(BUFFER$) THEN
  83.         LINE$ = NULL$
  84.         EXIT SUB
  85.     END IF
  86.  
  87.     ' Extract the line
  88.  
  89.     STRPOS = INSTR(OFFSET, BUFFER$, CRLF$)
  90.     LINE$ = MID$(BUFFER$, OFFSET, STRPOS - OFFSET)
  91.  
  92.     ' Point to the start of the next line
  93.  
  94.     OFFSET = STRPOS + 2
  95.  
  96.     END SUB
  97.  
  98.     '[]=============================================================[]
  99.     '[]   Returns one string from DATA$; works sequentially only    []
  100.     '[]=============================================================[]
  101.  
  102.     FUNCTION ReadData$ (DATA$) STATIC
  103.  
  104.     STATIC COUNT    ' Number of times called
  105.     STATIC START    ' Starting pos in string
  106.  
  107.     COUNT = COUNT + 1
  108.     IF COUNT = 1 THEN
  109.         START = 1
  110.     END IF
  111.  
  112.     WORK$ = ""
  113.     FOR INDX = START TO LEN(DATA$)
  114.         CHAR$ = MID$(DATA$, INDX, 1)
  115.         IF CHAR$ = "," THEN
  116.         EXIT FOR
  117.         END IF
  118.         WORK$ = WORK$ + CHAR$
  119.     NEXT INDX
  120.     START = INDX + 1
  121.  
  122.     ReadData$ = WORK$
  123.  
  124.     END FUNCTION
  125.  
  126.     '[]=============================================================[]
  127.     '[]     Returns longword clock ticks using DOS Interrupt    []
  128.     '[]=============================================================[]
  129.  
  130.     FUNCTION ReadTimer& STATIC
  131.  
  132.     INPREG.AX = &H0000
  133.     CALL INTERRUPT(&H1A, INPREG, OUTREG)
  134.  
  135.     IF OUTREG.DX < 0 THEN
  136.         LO& = 65536 + OUTREG.DX    ' Adjust for signed word
  137.     ELSE
  138.         LO& = OUTREG.DX
  139.     END IF
  140.  
  141.     TICKS& = (65536 * OUTREG.CX) + LO&
  142.  
  143.     ReadTimer& = TICKS&
  144.  
  145.     END FUNCTION
  146.  
  147.     '[]=============================================================[]
  148.     '[]        Converts string to a long integer        []
  149.     '[]=============================================================[]
  150.  
  151.     FUNCTION StrToInt& (NUMSTR$) STATIC
  152.  
  153.     IF LEFT$(NUMSTR$, 1) = "-" THEN
  154.         NEGATIVE = TRUE
  155.         WORK$ = RIGHT$(NUMSTR$, LEN(NUMSTR$) - 1)
  156.     ELSE
  157.         NEGATIVE = FALSE
  158.         WORK$ = NUMSTR$
  159.     END IF
  160.  
  161.     VALUE& = 0: POWER& = 1
  162.  
  163.     FOR INDX = LEN(WORK$) TO 1 STEP -1
  164.         BYTE$ = MID$(WORK$, INDX, 1)
  165.         IF (BYTE$ < "0" OR BYTE$ > "9") THEN
  166.         EXIT FOR
  167.         ELSE
  168.         VALUE& = VALUE& + (POWER& * (ASC(BYTE$) - 48))
  169.         POWER& = 10 * POWER&
  170.         END IF
  171.     NEXT INDX
  172.  
  173.     IF NEGATIVE THEN
  174.         StrToInt& = -VALUE&
  175.     ELSE
  176.         StrToInt& = VALUE&
  177.     END IF
  178.  
  179.     END FUNCTION
  180.